搜索 K
Appearance
博客正在加载中...
Appearance
在 Java1.4,Java 标准库内部就提供了这个工具类, java.util.logging
我们先看一个简单的例子
import java.util.logging.Level;
import java.util.logging.Logger;
public class HelloJDKLogging {
public static void main(String[] args) {
Logger logger = Logger.getGlobal();
logger.info("start process.....");
logger.warning("waring! memorey is running out");
logger.fine("new program is runing well... please ignored");
logger.severe("process will be terminated....");
}
} 输出如下:
> java HelloJDKLogging
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
信息: start process.....
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
警告: waring! memorey is running out
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
严重: process will be terminated....可以看到,虽然我们没设置输出打印的时间,调用类和执行方法是什么,但都自动打印了。为什么 logger.fine() 没有打印?因为 fine 的级别比较低。日志的输出可以设定级别。JDK 的 Logging 定义了 7 个日志级别,从严重到普通:
默认是 INFO 级别,INFO 级别以下的就不会打印了。通过调整级别,可以在系统运行稳定的时候只打印错误级别的日志,减少日志量。
既然是记日志,肯定得试着打印异常了,我们练习下:
import java.util.logging.Logger;
public class JDKLoggingException {
public static void main(String[] args) {
Logger logger = Logger.getGlobal();
try {
int n = 1 / 0;
} catch (Exception e) {
// TODO: handle exception
logger.severe(e.toString());
}
}
} 结果:
> javac .\JDKLoggingException.java
> java JDKLoggingException
十一月 29, 2022 9:24:45 下午 JDKLoggingException main
严重: java.lang.ArithmeticException: / by zero
前面我们说过,JDK logging 的默认打印级别的 INFO,这个默认配置是在哪的呢?我们能不能修改呢?可以的。
默认的配置文件在 $JAVA_HOME$/jre/lib/logging.properties,我们可以打开它,可以看到第 43 行是打印级别:
java.util.logging.ConsoleHandler.level = INFO我们尝试修改下这个打印级别为 fine:
java.util.logging.ConsoleHandler.level = FINE我们还需在该文件默认,添加包的日志级别:
com.peterjxl.logging.level = FINE 我们编写代码:
package com.peterjxl.logging;
import java.util.logging.Level;
import java.util.logging.Logger;
public class HelloJDKLogging2Default {
private static Logger logger = Logger.getLogger("com.peterjxl.logging");
public static void main(String[] args) {
logger.info("start process.....");
logger.warning("waring! memorey is running out");
logger.fine("new program is runing well... please ignored");
logger.severe("process will be terminated....");
}
} 然后编译和运行
> javac -d . HelloJDKLogging2Default.java
> java com.peterjxl.logging.HelloJDKLogging2Default
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
信息: start process.....
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
警告: waring! memorey is running out
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
详细: new program is runing well... please ignored
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
严重: process will be terminated....可以看到 logger.fine 确实有执行
一般来说,不用动到默认的配置文件,因为这个配置文件是公用的,一动可能会影响到其他项目的使用。我们先将 JVM 自带的配置文件还原。
所以,一般是指定一个配置文件,然后在项目启动的时候指定配置文件。
新建配置文件 logging.properties:
handlers= java.util.logging.FileHandler,java.util.logging.ConsoleHandler
.level= FINE
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter =java.util.logging.XMLFormatter
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter =java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = %1$tF %1$tH:%1$tM:%1$tS,%1$tL %4$s %2$s %5$s %n编译和运行,在 JVM 启动的时候指定配置文件
>java -Djava.util.logging.config.file=logging.properties HelloJDKLogging
2022-12-03 11:40:16,915 信息 HelloJDKLogging main start process.....
2022-12-03 11:40:16,973 警告 HelloJDKLogging main waring! memorey is running out
2022-12-03 11:40:16,974 严重 HelloJDKLogging main process will be terminated....可以看到和之前的输出不同:
>java HelloJDKLogging
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
信息: start process.....
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
警告: waring! memorey is running out
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
严重: process will be terminated.... 关于最后一行的说明:
java.util.logging.SimpleFormatter.format=%1$tF %1$tH:%1$tM:%1$tS,%1$tL %4$s %2$s %5$s %n
java -Djava.util.logging.config.file = logging.properties HelloJDKLogging
错误: 找不到或无法加载主类 .util.logging.config.file但是在 Windows 的终端里,就可以这样执行,待解决
本文简单介绍了下 Java 自带的日志类,意在让读者有个基本的认知,后面会介绍 Log4j